
// 用 8 个二进制位表示十进制的 -11
// 1. 用 8 个二进制位表示十进制的 11: 00001011
// 2. 11110100
// 3. +1 -> 11110101

// -1 -> 0b11110101
// 8-bit  -> 0b11110101 -> -11
// 16-bit -> 0b1111111111110101 -> -11
// 16-bit -> 0b0000000000001011 -> 11
// 对于负数来说，扩大位数在前面补 1；
// 对于正数来说，扩大位数在前面补 0；

// 对于一个由 8 个二进制位表达的有符号数字来说: -128 ~ 127
// 它的最小值的二进制是：___0b10000000_____；十进制是: ____-128______
//                  0b01111111 最大的正数 + 1
//                  0b10000000 -128
// 0b 1000 0000 -> 2^7 = -128
// 它的最大值的二进制是：__0b01111111______；十进制是: ____127______
// 
// 对于一个 16-bit 有符号数来说，它能表达的数字范围：_____ ~ _______

// min: 0b1000000000000000 -32768
//      0b1000000000000000 正数 -> 2^15  = 32768
// max: 0b0111111111111111 32767

// 在 C++ 里
// 表达一个字节的类型是：char，一个字节有几个二进制位？8-bit
// 表达 2 个字节是：short, 16-bit
// 表达 4 个字节是：int
// 表达 8 个字节是：long
// 表达 16 个字节的类型是：long long

// 数值转换
// 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
// 每一个十六进制数变成 4-bit 的二进制数，拼起来
// 0x33 -> 0b00110011
// 0x55 -> 0b01010101
// 0x1234 -> 1001000110100
//           1001000110100

// 二进制按位运算
// 或 ｜
// 与 &
// 异或 ^
// 0b1001 | 0b0110 = 0b1111
// 0b1001 & 0b0110 = 0b0000
// 0b1001 ^ 0b0110 = 0b1111

short m = 0b1000000000000001;
unsigned short n = 0b1000000000000001;
/*
x    = 0b00000010
       0b00001000
       0b00001010
       0b00110011
       0b00000010
y    = 0b00000010
0x33 = 0b00110011
0x55 = 0b01010101

x = (x | x << 2) & 0x33

12

x = 0b00011100 00000000
x = 0b11100000 00000000
x = 0b00000000 01111000
y = 0b00000000 11110000
*/